"""
复选框小部件。
"""
import typing
from ..framework import dispatch, session_received
from ..base import BaseSession, BaseSessionType, BaseSessionParentType
from .base import BaseTextWidget
from ..utils import callback, to_any


@session_received
class WidgetCheckBox(BaseSession, BaseTextWidget):
    """
    复选框小部件。
    """
    name: typing.ClassVar[str] = 'WidgetCheckBox'

    @classmethod
    async def create(cls: typing.Type[BaseSessionType], parent: BaseSessionParentType, *args: typing.Any,
                     **kwargs: typing.Dict) -> BaseSessionType:
        """
        五个参数：
        @width: 宽度；
        @height: 高度；
        @x: 左上角横坐标；
        @y: 左上角纵坐标；
        @text: 复选框的文字内容（可选，默认为None）
        使用方法：
        check_box = await WidgetCheckBox.create(activity, 200, 50, 0, 0, '不在询问')
        """
        return await super().create(parent, *cls.parse_region_and_text(*args), **kwargs)

    async def on_receive(self, msg):
        """
        组件的事件转发。
        """
        await super().on_receive(msg)
        name, sid, fid = msg.name, msg.session, msg.future
        if name == 'onIsChecked':
            dispatch(self.on_is_checked(*msg.argv, session_id=sid, future_id=fid))
        else:
            dispatch(super().on_widget_action(*msg.argv, name=name, session_id=sid, future_id=fid))

    @callback(bool)
    async def on_is_checked(self, checked, session_id=0, future_id=0):
        """
        当获取复选框的选择状态成功后，此方法被自动调用。
        通常不需要关注此方法的实现。
        """
        if not session_id:
            return
        self.set_action_result(session_id, future_id, checked)

    async def is_checked(self) -> bool:
        """
        获取复选框的选择状态。
        调用示例：
        print(await check_box.is_checked())
        """
        return await self.send_action_until_return('isChecked')

    async def set_checked(self, checked: bool):
        """
        给复选框设置选择状态。
        :param checked: 选中是True，去选是False。
        调用示例：
        await check_box.set_checked(True)
        """
        dispatch(self.send_action('setChecked', to_any(checked)))
